﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Concert.Musique;
using System.Xml.Linq;

namespace Concert.LastFm
{
    public class LastFmApi
    {
        #region champs

        private static string url_getEventsByArtist = "http://ws.audioscrobbler.com/2.0/?method=artist.getevents&artist=#nomArtiste#&api_key=26084e5dbfd8db9cdb648fe8b6f83ac9";
        private static string url_getEventsByGeo = "http://ws.audioscrobbler.com/2.0/?method=geo.getevents&location=#location#&api_key=26084e5dbfd8db9cdb648fe8b6f83ac9";
        #endregion

        #region Méthodes
        public static List<Event> getEventsByArtist(string nomArtiste)
        {
            //On crée une liste d'évènements qui contiendra tous les events
            List<Event> lesEvents = new List<Event>();
            List<Artist> lesArtistes = new List<Artist>();

            //On remplace dans le lien #nomArtiste# par le nom d'artiste demandé
            string getEventsByArtist = url_getEventsByArtist.Replace("#nomArtiste#", nomArtiste);

            //On charge le fichier XML => Parcourt de l'arborescence
            IEnumerable<XElement> xLesEvents = XDocument.Load(getEventsByArtist).Root.Element("events").Elements("event");

            

            //On parcourt les évènenements
            foreach (XElement xUnEvent in xLesEvents)
            {
                //On crée les artistes
                IEnumerable<XElement> xLesArtistes = xUnEvent.Elements("artists");

                //On crée une venue
                XElement xUneVenue = xUnEvent.Element("venue");
                XElement xUneLocation = xUneVenue.Element("location");
                XElement xGeoPoint = xUneLocation.Elements().ElementAt(4);
                XElement xLat = xGeoPoint.Elements().ElementAt(0);
                XElement xLong = xGeoPoint.Elements().ElementAt(1);

                //On parcourt les artistes de l'événement
                foreach (XElement xUnArtiste in xLesArtistes)
                {
                    //On crée l'artiste
                    Artist unArtiste = new Artist(xUnArtiste.Element("artist").Value);

                    //On ajoute l'artiste à la liste des artistes de l'événement
                    lesArtistes.Add(unArtiste);
                }
                //On crée l'événement
                Event unEvent = new Event(xUnEvent.Element("id").Value,
                                            xUnEvent.Element("title").Value,
                                            new Venue(xUneVenue.Element("id").Value,
                                                        xUneVenue.Element("name").Value,
                                                        new Location(xUneLocation.Element("city").Value,
                                                                    xUneLocation.Element("country").Value,
                                                                    xUneLocation.Element("street").Value, 
                                                                    xLat.Value,
                                                                    xLong.Value
                                                                    )), lesArtistes);
                //On ajoute à la liste des événements un évenement
                lesEvents.Add(unEvent);

            }

            return lesEvents;
        }

        public static List<Event> getEventsByGeo(string location)
        {
            //On crée une liste d'événements
            List<Event> lesEvents = new List<Event>();

            //On remplace dans le lien #location# par la location demandée
            string getEventsByGeo = url_getEventsByGeo.Replace("#location#", location);

            //On charge le fichier XML => Parcourt de l'arborescence
            IEnumerable<XElement> xLesEvents = XDocument.Load(getEventsByGeo).Root.Element("events").Elements("event");

            //On crée une liste d'artistes qui contiendra tous les artistes
            List<Artist> lesArtistes = new List<Artist>();

            //On parcourt les events
            foreach (XElement xUnEvent in xLesEvents)
            {
                //On crée les artistes
                IEnumerable<XElement> xLesArtistes = xUnEvent.Elements("artists");

                //On crée une Venue
                XElement xUneVenue = xUnEvent.Element("venue");

                //On crée une location
                XElement xUneLocation = xUneVenue.Element("location");
                XElement xGeoPoint = xUneLocation.Elements().ElementAt(4);
                XElement xLat = xGeoPoint.Elements().ElementAt(0);
                XElement xLong = xGeoPoint.Elements().ElementAt(1);

                //On parcourt les artistes
                foreach (XElement xUnArtiste in xLesArtistes)
                {
                    //On instancie un artiste
                    Artist monArtiste = new Artist(xUnArtiste.Element("artist").Value);

                    //On ajoute à la liste des artistes un artiste
                    lesArtistes.Add(monArtiste);
                }

                //On instancie un événement
                Event unEvent = new Event(xUnEvent.Element("id").Value,
                                            xUnEvent.Element("title").Value,
                                            new Venue(xUneVenue.Element("id").Value,
                                                        xUneVenue.Element("name").Value,
                                                        new Location(xUneLocation.Element("city").Value,
                                                                    xUneLocation.Element("country").Value,
                                                                    xUneLocation.Element("street").Value,
                                                                    xLat.Value,
                                                                    xLong.Value)),
                                                                    lesArtistes);
                //On ajoute à la liste des événements un événement
                lesEvents.Add(unEvent);
            }

            return lesEvents;
        }
        #endregion
    }
}
